#ifndef __RUN_CODE_PARAMS_H__
#define __RUN_CODE_PARAMS_H__

#include <string>
#include "../languages/baseLang.h"

// 代码运行参数
struct RuncodeParams {
    std::string language;                   // 语言类型
    int judgeType;                          // 题型
    std::string filename;                   // 当前用户代码所在文件
    std::string initPath;                   // 题目初始化路径
    std::string dataPath;                   // 题目所在路径
    std::string spjPath;                    // 特判文件路径
    int timeLimit = 1000;                   // 时间限制,ms
    int memoryLimit = 65536 * 1024;         // 内存限制,kb
    int compareFlag = STRICT_CNSISTENT;     // 文本比对模式
    int ruler = ACM_CONTENT;                // 赛制
    int querySet = RETURN_FIRST_OUTPUT;     // 结果集
    std::string eps = "";                   // 误差
    std::string userCachePath = "";              // 将用户代码拷贝到file地址下，代码将在此文件同级目录下编译，若一些需要项目构建的语言，则将此作为项目名
    std::string spjCachePath = "";               // 将特判文件拷贝到spjfile地址下，代码将在此文件同级目录下编译，若一些需要项目构建的语言，则将此作为项目名
};

struct CodeFileInfo {
    Language* lang;
    std::string codeFile, binFile;
    std::string compileStr, runStr;
};

std::ostream& operator<<(std::ostream& out, const RuncodeParams& rcps);
std::ostream& operator<<(std::ostream& out, const CodeFileInfo& cfi);
std::string findSpjFileLangType(std::string spjFile);


extern std::unordered_map<std::string, const Language*> langMap;
extern std::unordered_map<std::string, std::string> suffixMap;

extern const Language *DEFAULT_LANG;

#endif /* __RUN_CODE_PARAMS_H__ */
